package opf5.entities.jugadores;

import java.util.LinkedList;
import java.util.List;

import opf5.entities.dominio.Calificacion;
import opf5.entities.dominio.Infraccion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.excepciones.OperacionNoPermitidaException;
import opf5.entities.infracciones.InfraccionConcreta;
import opf5.entities.repositorios.OPF5Factory;
import opf5.utilidades.Fecha;

public class JugadorConcreto implements Jugador {
	private String email;
	private List<Infraccion> infracciones = new LinkedList<Infraccion>();
	private String nombre;
	private List<Calificacion> calificaciones = new LinkedList<Calificacion>();
	private int handicap;
	private boolean esAdministrador;
	private Fecha fecha;

	
	public boolean isEsAdministrador() {
		return esAdministrador;
	}

	public void setEsAdministrador(boolean esAdministrador) {
		this.esAdministrador = esAdministrador;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setInfracciones(List<Infraccion> infracciones) {
		this.infracciones = infracciones;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public void setCalificaciones(List<Calificacion> calificaciones) {
		this.calificaciones = calificaciones;
	}

	public JugadorConcreto(String nombre, String email, Fecha fechaNacimiento) {
		this.nombre = nombre;
		this.email = email;
		this.fecha = fechaNacimiento;
	}

	@Override
	public String getEmail() {
		return email;
	}

	@Override
	public int getCantidadDeInfracciones() {
		return infracciones.size();
	}

	@Override
	public void agregarInfraccion(Infraccion infraccion) {
		infracciones.add(infraccion);
	}

	@Override
	public String getNombre() {
		return nombre;
	}

	@Override
	public List<Calificacion> getCalificaciones() {
		return calificaciones;
	}

	@Override
	public void agregarCalificacion(Calificacion calificacion) {
		verificarCalificacionValida(calificacion);
		calificaciones.add(calificacion);
	}

	private void verificarCalificacionValida(Calificacion calificacion) {
		for (Calificacion c : calificaciones) {
			if (c.esSimilarA(calificacion))
				throw (new OperacionNoPermitidaException("No se puede calificar"
						+ " a un jugador dos veces por un mismo partido"));
		}
	}

	@Override
	public void setHandicapJugador(int handicap) {
		this.handicap = handicap;
	}

	@Override
	public int getHandicap() {
		return this.handicap;
	}

	@Override
	public List<Infraccion> getInfracciones() {
		return this.infracciones;
	}

	@Override
	public boolean fueCalificadoPor(Jugador jugador, Partido partido) {
		Calificacion c = this.getCalificacion(jugador, partido);
		return c != null;
	}

	@Override
	public Calificacion getCalificacion(Jugador jugador, Partido partido) {
		for (Calificacion c : calificaciones) {
			if (c.getJugadorCalificador().equals(jugador) && c.getPartido().equals(partido)) {
				return c;
			}
		}
		
		return null;
	}

	@Override
	public Fecha getFechaNac() {
		return this.fecha;
	}

	public boolean getEsAdministrador() {
		return esAdministrador;
	}

	public void setFechaNacimiento(Fecha fecha) {
		this.fecha = fecha;
	}
}
